package eightDataType;

/**
 * @author Ajie
 * @date 1/7/25
 * @function

byte 类型是一个
有符号的8位整数，其取值范围为 -128 到 127
无符号：byte 类型可以表示从 0x00 到 0xFF 的所有可能值 【0,255】

十六进制	二进制	无符号十进制	有符号十进制
0x00	00000000	0	      0
0x7F	01111111	127	    127
0x80	10000000	128	    -128
0xFF	11111111	255	    -1


1. 强制类型转换的必要性：
•	0xAA 作为一个整数常量在Java中默认是 int 类型，值为 170。
•	170 超出了 byte 的正范围（-128 到 127），因此需要进行强制类型转换 (byte) 0xAA。
2.	转换后的结果：
•	(byte) 0xAA 的结果是 -86，因为 170 - 256 = -86。


data[index++] = (byte) 0xAA; // 强制转换，结果为 -86
将 byte 作为无符号数转换回 int
int unsignedValue = byteValue & 0xFF; // 结果为 170


强制类型转换 (byte) 0xAA 的变化
1. 原始值的表示
•	十六进制 0xAA：
•	十进制表示为 170。
•	二进制表示为 10101010。
•	Java 中的 int 类型：
•	0xAA 被解释为一个 int，在32位系统中，其二进制表示为：
00000000 00000000 00000000 10101010

2. 强制转换为 byte
•	byte 类型的范围：
•	在Java中，byte 是一个有符号的8位整数，范围为 -128 到 127。
•	转换过程：
•	当你执行 (byte) 0xAA 时，Java会截取 0xAA 的最低8位：
10101010
最高位（最左边的1）表示负数。因此，这个二进制数 10101010 被解释为负数。

3. 是否存在精度丢失？ 不存在。在 0x00,0xFF内。  超过这个值,存在精度丢失。0,255
•	数值位数：
•	int 是32位，而 byte 是8位。
•	在这种转换中，0xAA（即 170）的二进制表示仅使用了8位，所以转换时没有高位的数据被截断。

 */
public class ByteDataNet {
    public static void main(String[] args) {

        byte[] bytes = new byte[0];
        System.out.println("ByteDataNet:main:"+bytes.length);

        // 1. 定义一个整数常量 0xAA
        int originalValue = 0xAA; // 170 in decimal

        // 2. 将 0xAA 强制转换为 byte
        byte byteValue = (byte) originalValue;

        // 3. 打印 byte 的有符号值
        System.out.println("有符号 byte 值: " + byteValue); // 输出: -86

        // 4. 将 byte 作为无符号数转换回 int
        int unsignedValue = byteValue & 0xFF;

        // 5. 使用 Byte.toUnsignedInt 方法（Java 8 及以上）
        // int unsignedValue = Byte.toUnsignedInt(byteValue);

        // 6. 打印无符号值的十进制和十六进制表示
        System.out.println("无符号 byte 值: " + unsignedValue); // 输出: 170
        System.out.printf("无符号 byte 的十六进制表示: 0x%02X%n", unsignedValue); // 输出: 0xAA
    }
}
